## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
##
## Attaching package: 'stationery'
## The following object is masked from 'package:knitr':
##
## rnw2pdf
El subindexado de vectores atómicos permite obtener partes de un vector atómico (los primeros elementos, los 10 últimos, etc.) y es útil en muchos tipos de análisis que suceden en diversas ramas de la ciencia. Supongamos que tenemos lo siguiente:
[1] 0.65326200 -0.39528316 -0.42493054 -1.23432215 1.85039505 -2.74241018
[7] -0.46082527 -0.72774323 -1.11305319 -0.72724669 -0.11484548 -0.97613349
[13] 0.53021026 0.51301108 0.73903265 -0.35484618 -0.06464238 0.94993502
[19] 0.55424980 0.21638871
1.- ?Cuál es el resultado de dnormales[order(x)],
dnormales[1:length(vec)], dnormales[-20],
dnormales[vec>0.5]?
[1] -2.42636461 -1.66617289 -1.41921131 -1.27294904 -1.08847843 -1.04876210
[7] -1.01404592 -0.83932325 -0.77528437 -0.63566196 -0.31240272 -0.12597816
[13] 0.01420907 0.35485379 0.44227851 0.47084210 0.78049889 0.84165032
[19] 1.17609340 1.97131351
[1] 0.73314972 -0.51035534 0.90352246 0.69173390 0.64498622 1.38977318
[7] -0.29062007 -0.06668841 0.80119634 1.35024792 -0.83194687 -1.60368914
[13] -1.09920704 -0.46311371 -0.51303307 -0.05905544 1.73765469 0.59022979
[19] 0.13694610 -0.11977901
[1] 0.73314972 -0.51035534 0.90352246 0.69173390 0.64498622 1.38977318
[7] -0.29062007 -0.06668841 0.80119634 1.35024792 -0.83194687 -1.60368914
[13] -1.09920704 -0.46311371 -0.51303307 -0.05905544 1.73765469 0.59022979
[19] 0.13694610 -0.11977901
[1] -1.05295836 -0.36588722 -0.31644633 -0.37355889 1.75229115 0.20099583
[7] -1.38344270 1.99989471 -1.16492590 1.00245824 -1.11914395 0.71800121
[13] 0.05743746 -1.48436294 0.48949656 -1.30832196 -0.88358558 -0.16769191
[19] 1.76742017
[1] 1.1278274 1.0519932 0.9818293 0.5399867 1.4412576
2.- ?Qué sucede si hacemos dnormales[0:3]? ?Cuál es la
longitud del vector?
[1] 20
[1] -0.4130547 1.2613171 -0.9227400
[1] 3
3.- Ahora suponga que x <- c(1,24,8) y
uno <- c(T,T,F). ?Qué sucede si hacemos
x[uno]? ?Y si hacemos x[as.double(uno)]?
[1] 1 24
[1] 1 1
Puede referirse a las diapositivas
Las listas se pueden subindexar mediante los operadores
[, [[ y $. Recordemos que cuando
indexamos con [, el resultado siempre es del mismo tipo.
Ahora suponga que tenemos la siguiente lista:
listaPrueba <- list(Mayusculas = LETTERS[1:15], Ciudades = c("Cancun", "Playa", "Chetumal", "Merida"), casos = list(a=23, b= 1:8, c=list(d=1,e=TRUE)))
valor_e <- listaPrueba$casos$b[3]
valor_e[1] 3
Ejercicios (en base al objeto listaPrueba),
1.- ?Con qué comando puedo obtener la lista casos?
str(listaPrueba[[3]]) 2.- ?Cómo puedo obtener el único
valor lógico de listaPrueba? valor_e <-
listaPrueba\(casos\)c$e
valor_e
3.- ?Qué sucede si hago listaPrueba[[3]]$c[[2]], es esto
equivalente a listaPrueba$casos[[3]][[2]]? Explique
Lo que su sede es que listaPrueba[[3]]\(c[[2]] es igual a la
listaPrueba\)casos[[3]][[2]], en el primer ejemplo ingresamos al
dato 3 de la lista principal y de ahí a la sublista, y luego al dato 2,
lo que queda como resultado es el valor booleano.
4.- ?Cuál es la diferencia entre listaPrueba[1] y
listaPrueba[[1]]? imprime en pantalla el nombre de
la casilla y los datos dentro de ella el otro solo
imprime los elementos
5.- ?Cómo puedo obtener el objeto "Chetumal"?
valor_e <- listaPrueba$Ciudades[3]
valor_e
6.- ?Cómo puedo obtener el tercer elemento de b?
valor_e <- listaPrueba\(casos\)b[3]
valor_e
Suponga que tenemos la matriz:
matriz1 <- matrix(rnorm(20), nrow=5)
r1 <- matriz1[c(1,2),c(3,4)]
r2 <- matriz1[1:2,c(3,4)]
resultado <- identical(r1 , r2)
resultado[1] TRUE
A partir de matriz1, hallar:
1.- La matriz que consta de las primeras dos columnas de
matriz1. matriz1[,1:2]
2.- La matriz que consta de las primeras dos filas y dos columnas de
matriz1. matriz1[1:2,1:2] 3.- La matriz
que consta del elemento \(a_{2,3}\) de
matriz1 matriz1[2,3]
4.- ?Son equivalentes los comandos
matriz1[c(1,2),c(3,4)] y matriz1[1:2,c(3,4)]?
(tip: puede probar con el comando identical)
r1 <- matriz1[c(1,2),c(3,4)] r2 <- matriz1[1:2,c(3,4)]
resultado <- identical(r1 , r2)
resultado
data.frameEl subindexado de data.frames es similar al subindexado
por medio de listas y matrices. En este caso nos concentraremos en el
paquete dplyr que permite manipular
data.frames. Cualquier paquete en R se puede
instalar mediante el comando
install.packages(<nombre.paquete>), por ejemplo para
instalar dplyr hacemos:
install.packages("dplyr", dependencies = TRUE) # instalo el paquete
library(dplyr) # Cargo el paquete para trabajar con sus funciones1.- Investigar para qué sirve el paquete dplyr.
El paquete dplyr es una herramienta muy útil en RStudio y en R
en general para la manipulación y transformación de datos enmarcada en
la programación funcional. dplyr se utiliza para realizar operaciones de
manipulación de datos de manera eficiente, lo que facilita la
exploración y el análisis de datos en R
2.- ?Cuáles son los comandos importantes del paquete
dplyr? filter(): Filtra filas de un DataFrame en
función de condiciones específicas. Por ejemplo, puedes usar filter()
para seleccionar filas que cumplan con ciertos criterios.
select(): Selecciona columnas específicas de un DataFrame. Útil cuando solo deseas trabajar con un subconjunto de las variables.
mutate(): Crea nuevas columnas o modifica columnas existentes en un DataFrame. Puedes usarlo para calcular nuevas variables basadas en las existentes.
arrange(): Ordena filas de un DataFrame en función de una o más columnas. Puedes especificar el orden ascendente o descendente.
summarize() y group_by(): Son útiles para resumir datos agregados. group_by() permite agrupar datos por una o más columnas y summarize() se utiliza para resumir los datos dentro de cada grupo.
join(): Combina dos o más DataFrames en función de claves comunes. dplyr admite varios tipos de uniones, como inner join, left join, right join y full join.
rename(): Cambia el nombre de las columnas de un DataFrame.
distinct(): Encuentra filas únicas en un DataFrame, eliminando duplicados.
sample_n() y sample_frac(): Extrae aleatoriamente un número específico de filas o una fracción de filas de un DataFrame.
3.- Supongamos que tenemos un data.frame
df <- data.frame(a=1:8, letras =letter[1:8]), qué sucede
si aplico select(df, a). ?Y si aplico
filter(df, a<5)?
a
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
a letras
1 1 a
2 2 b
3 3 c
4 4 d
Los gráficos permiten mostrar múltiples características de una
función. Los máximos, mínimos, etc., son métricas que nos dicen mucho
acerca del comportamiento de una función. R nos permite
graficar funciones de manera sencilla utilizando el concepto de vector.
Por ejemplo, quizás estemos interesados en conocer la forma de onda de
la función seno acotada, la cual se define matemáticamente mediante la
siguiente fórmula:
\[
f(t) = \begin{cases}
\sin(2 \pi t) & \mbox{para} -1 < t < 1\\
0 & \mbox{resto}.
\end{cases}
\] Y la cual en R se graficar? de la siguiente
manera:
t <- seq(-1, 1, length=100)
ft <- sin(2*pi*t) # Se calcula la funcion seno a partir de t
plot(t, ft, type="l", xlim=c(-4,4), ylim=c(-1.5,1.5), main="Funcion seno", xlab="tiempo", ylab="Valores")
grid()
## ejemplocon highcharter
x <- seq(-4,4, length=1000)
ft <- ifelse(x>-1 & x<1, sin(2*pi*x),0)
highchart() %>% hc_add_series(cbind(x,ft),name="Funcion seno") %>% hc_title(text="Funcion seno")R permite añadir gráficos o puntos mediante las
funciones lines() y points(). El siguiente
código ejemplifica lo anterior.
t <- seq(-3,3, length=200)
f1 <- sin(2*pi*(t))
f2 <- sin(2*pi*(t-1/4))
f3 <- sin(2*pi*(t-1/2))
plot(t,f1, type= "l", main="Funcion seno y versiones", xlab="tiempo", ylab="Valores")
grid()
lines(t,f2, col="red")
points(t,f3,col="blue")De igual manera se pueden definir funciones por tramos con el comando
ifelse(), por ejemplo grafiquemos la siguiente función:
\[ f(t) = \begin{cases} 2+t & \; -2<t<-1\\ 1 & \; -1<t<1\\ 2-t & \;1<t<2\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> -2 & t < -1, 2+t, ifelse(t>= -1 & t <= 1, 1, ifelse(t>1 & t< 2, 2-t, 0)))
plot(t, ft, type = "l", main="Funcion por tramos", xlab="tiempo", ylab="Valores")
grid()Graficar las siguientes funciones:
\[ f(t) = \begin{cases} 1 & \; t>0\\ 0 & \; \mbox{resto} \end{cases} \]
\[ f(t) = \begin{cases} 1+t & \; -1<t<0\\ 1-t & \; 0 \le t<1\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> -1 & t < 0, 1+t, ifelse(t>= 0 & t < 1, 1-t,0))
plot(t, ft, type = "l",col="red")
grid()\[ f(t) = \begin{cases} \mbox{e}^{-2t} & \; 0<t<2\\ 1+t & \; -1<t<0\\ 0 & \; \mbox{resto} \end{cases} \]
t <- seq(-3,3, length=100)
ft <- ifelse(t> 0 & t < 2,exp(-2 * t) , ifelse(t> -1 & t < 0, 1+t,0))
plot(t, ft, type = "o",col="blue")
grid()Los gráficos en 3D permiten visualizar funciones del tipo: \(f(x,y)\), donde \(x\) e \(y\) representan variables independientes.
Como ejemplo veamos la forma en la cual R grafica la
siguiente funci?n \(f(x,y) =
\sqrt{16-4x^2-y^2}\):
x <- seq(-2,2,length=50)
y <- seq(-4,4, length=50)
z <- outer(x,y,function(x,y) sqrt(16-4*x^2-y^2))
z[is.na(z)] <- 0
persp(x,y,z, theta=-30, expand=0.5,ticktype = "detailed")Ejemplos: Ahora veamos la manera de hacerla con más funciones.
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) y^2-x^2)
persp(x,y,z, theta=-30, expand=0.6, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (2-y^2+x^2)*exp(1-x^2-(y^2)/4))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x+y)
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) 6-(2*x)-(3*y))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed") x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (x^2)+(4*y^2) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) sqrt(9-(x^2)-(y^2) ) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x*y )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) exp((x*y)/2 ))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x/((x^2)+(y^2)))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) log(x-y + 1e-6))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed", main = "perspective plot 1")